﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Media;
using System.IO;
using BibliotecaClasse;


namespace AlarmConsole001
{
    class Program
    {
        static DAOXMLDespetador dao = new DAOXMLDespetador();
        static RN rn = new RN();
        static Tela tela = new Tela();
        static SoundPlayer sound = new SoundPlayer();
        static String ctrl;

        static void Main(string[] args)
        {

            Thread t = new Thread(disparaThread);
            t.Start();

            do
            {
                Console.Title = "Gerenciador de Alarme";

                //Define cor de fundo e letra da tela
                Console.BackgroundColor = ConsoleColor.Yellow;
                Console.ForegroundColor = ConsoleColor.Black;
                Console.Clear();
                Console.WriteLine(tela.header());
                Console.WriteLine(tela.menu());
                Console.Write(tela.hr());
                Console.Write(tela.pointer());
                ctrl = Console.ReadLine();

                Seleciona(ctrl);
            }


            while (!ctrl.Equals("0"));
            {
                Console.WriteLine("Adeus!");
                Environment.Exit(0);
            }
        }
        //final Main()---------------------------------------------------------------------------

             /**
              * Dispara alarmes
              * Instruções a serem executadas quando a thread é iniciada.
              */
        public static void disparaThread()
        {
            
            sound = new SoundPlayer("C:/Windows/Media/ringout.wav");

            while (true)
            {
                List<Alarme> l = rn.RetornaLista();
                String agora = DateTime.Now.Hour.ToString("00") + ":" + DateTime.Now.Minute.ToString("00");
                Alarme alarme = rn.IsTime(l, agora);
                if (alarme != null)
                {
                    sound.PlayLooping();
                    Console.WriteLine("\nAlarme!!!");
                    Console.WriteLine(tela.ExibirAlarme(alarme));
                    Console.Write(tela.hr());
                    Console.WriteLine("Pressione qualquer tecla para silenciar alarme.");
                    Console.ReadKey();
                    sound.Stop();


                } 
                Thread.Sleep(60000);
            }
        }
        //final disparaThread()---------------------------------------------------------------------------
        
        /**
          * Método que direciona para instruções da opção escolhida
         */
        public static void Seleciona(String ctrl) 
        {

          /**
           * Opção ADICIONAR ALARME
           * Instruções a serem executadas quando a opção 1 for escolhida.
          */
            if (ctrl.Equals("1"))
            {
                Console.Clear();
                Alarme a = new Alarme();

                Console.WriteLine(tela.header());
                Console.WriteLine(tela.add());
                Console.Write(tela.day());
                Console.Write(tela.pointer());
                a.Dia = Console.ReadLine().ToLower();
                Console.Write(tela.hour());
                Console.Write(tela.pointer());
                a.Hora = rn.FixHour(Console.ReadLine());
                Console.Write(tela.active());
                Console.Write(tela.pointer());
                a.Ativo = Console.ReadLine().ToUpper();
                Console.Write(tela.desc());
                Console.Write(tela.pointer());
                a.Desc = Console.ReadLine();
                Console.Write(tela.hr());
                
                String erroMsg = "";

                if (!rn.ValidaDia(rn.ConverteDia(a.Dia)))
                {
                    erroMsg += "\nPor favor, verifique formato de dia informado.";
                }

                if (!rn.ValidaHora(a.Hora))
                {
                    erroMsg +="\nPor favor, verifique formato de hora informado.";
                }

                if (!rn.ValidaAtivo(a.Ativo))
                {   
                    erroMsg +="\nPor favor, informe S ou N para Ativo.";
                }
                
                if(erroMsg.Equals(""))
                {
                        try
                        {
                            rn.AdicionaAlarme(a);
                            Console.WriteLine("\nAlarme adicionado com sucesso!" + tela.returnMsg());
                            Console.ReadKey();
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message + tela.returnMsg());
                            Console.ReadKey();
                        }
                }
                else
                {
                    Console.WriteLine("\nO alarme não foi adicionado! Há inconformidade nos dados informados.");
                    Console.WriteLine(erroMsg);
                    Console.WriteLine(tela.returnMsg());
                    Console.ReadKey();
                }

            }
            //final (ctrl.Equals("1"))---------------------------------------------------------------------------


            /**
             * Opção EDITAR ALARME
             * Instruções a serem executadas quando a opção 2 for escolhida.
            */
            else if (ctrl.Equals("2"))
            {

                /**
                 * tenta listar alarme, se não encontrar aquivo retorna exception.
                 */
                try
                {
                    List<Alarme> lista = rn.RetornaLista();

                    if (lista.Count() == 0)
                    {
                        Console.WriteLine("Não há alarmes cadastrados!");
                        Console.ReadKey();
                    }
                    else
                    {
                        Console.Clear();

                        Alarme a = new Alarme();

                        Console.Write(tela.header());
                        Console.WriteLine(tela.list());
                        Console.Write(tela.ListarAlarmes(rn.RetornaLista()));
                        Console.WriteLine(tela.hr());
                        Console.WriteLine(tela.edit());
                        Console.WriteLine(tela.instrucaoEdit());
                        Console.WriteLine(tela.cod());
                        Console.Write(tela.pointer());
                        String codAux = Console.ReadLine();

                        if (rn.IsNumeric(codAux))
                        {
                           /**
                            * tenta converter entrada em int,
                            * se der erro chama exception
                            */
                            try
                            {
                                a.Cod = Convert.ToInt32(codAux);

                                if (!rn.VerificaExiste(a.Cod))
                                {
                                    Console.WriteLine(tela.hr());
                                    Console.WriteLine(tela.notFound() + tela.returnMsg());
                                    Console.ReadKey();
                                }
                                else
                                {
                                    Console.Write(tela.day());
                                    Console.Write(tela.pointer());
                                    a.Dia = Console.ReadLine().ToLower();
                                    Console.Write(tela.hour());
                                    Console.Write(tela.pointer());
                                    a.Hora = rn.FixHour(Console.ReadLine());
                                    Console.Write(tela.active());
                                    Console.Write(tela.pointer());
                                    a.Ativo = Console.ReadLine().ToUpper();
                                    Console.Write(tela.desc());
                                    Console.Write(tela.pointer());
                                    a.Desc = Console.ReadLine();
                                    Console.Write(tela.hr());

                                    String erroMsg = "";

                                    if (!rn.ValidaDia(rn.ConverteDia(a.Dia)))
                                    {
                                        erroMsg += "\nPor favor, verifique formato de dia informado.";
                                    }

                                    if (!rn.ValidaHora(a.Hora))
                                    {
                                        erroMsg += "\nPor favor, verifique formato de hora informado.";
                                    }

                                    if (!rn.ValidaAtivo(a.Ativo))
                                    {
                                        erroMsg += "\nPor favor, informe S ou N para Ativo.";
                                    }

                                    if (erroMsg.Equals(""))
                                    {
                                        try
                                        {
                                            rn.EditaAlarme(a);
                                            Console.WriteLine("\nAlarme editado com sucesso!" + tela.returnMsg());
                                            Console.ReadKey();
                                        }
                                        catch (Exception e)
                                        {
                                            Console.WriteLine(e.Message + tela.returnMsg());
                                            Console.ReadKey();
                                        }

                                    }
                                    else
                                    {
                                        Console.WriteLine("\nO alarme não foi editado! Há inconformidade nos dados informados.");
                                        Console.WriteLine(erroMsg);
                                        Console.WriteLine(tela.returnMsg());
                                        Console.ReadKey();
                                    }

                                }
                            }
                            catch (System.ArgumentException e)
                            {
                                Console.WriteLine(e.Message + tela.returnMsg());
                                Console.ReadKey();
                            }
                            catch (System.FormatException e)
                            {
                                Console.WriteLine(e.Message + tela.returnMsg());
                                Console.ReadKey();
                            }
                            catch (System.OverflowException e)
                            {
                                Console.WriteLine(e.Message + tela.returnMsg());
                                Console.ReadKey();
                            }
                        }
                        else
                        {
                            Console.WriteLine("\nERRO!!!\nO Código deve conter números!"+tela.returnMsg());
                            Console.ReadKey();
                        }

                    }
                }
                catch (FileNotFoundException e)
                {
                    Console.WriteLine(e.Message + tela.returnMsg());
                    Console.ReadKey();
                }
            }
            //final (ctrl.Equals("2"))---------------------------------------------------------------------------


             /**
              * Opção DELETAR ALARME
              * Instruções a serem executadas quando a opção 3 for escolhida.
             */
            else if (ctrl.Equals("3"))
            {
                /**
                 * tenta listar alarme, se não encontrar aquivo retorna exception.
                 */
                try
                {
                    List<Alarme> lista = rn.RetornaLista();

                    if (lista.Count() == 0)
                    {
                        Console.WriteLine("Não há alarmes cadastrados!");
                        Console.ReadKey();
                    }
                    else
                    {
                        Console.Clear();
                        Alarme a = new Alarme();

                        Console.WriteLine(tela.header());
                        Console.WriteLine(tela.list());
                        Console.WriteLine(tela.ListarAlarmes(rn.RetornaLista()));
                        Console.Write(tela.hr());

                        Console.WriteLine(tela.del());
                        Console.Write(tela.cod());
                        Console.Write(tela.pointer());
                        
                        String codAux = Console.ReadLine();

                        if (rn.IsNumeric(codAux))
                        {
                            /**
                             * tenta converter entrada em int,
                             * se der erro chama exception
                             */
                            try
                            {
                                a.Cod = Convert.ToInt32(codAux);

                                if (!rn.VerificaExiste(a.Cod))
                                {
                                    Console.WriteLine(tela.hr());
                                    Console.WriteLine(tela.notFound() + tela.returnMsg());
                                    Console.ReadKey();
                                }
                                else
                                {
                                    try
                                    {
                                        rn.ExcluiAlarme(a.Cod);
                                        Console.WriteLine("Alarme deletado com sucesso!" + tela.returnMsg());
                                        Console.ReadKey();
                                    }

                                    catch (Exception e)
                                    {
                                        Console.WriteLine(e.Message + tela.returnMsg());
                                        Console.ReadKey();
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Console.WriteLine(e.Message + tela.returnMsg());
                                Console.ReadKey();
                            }
                        }
                        else
                        {
                            Console.WriteLine("\nERRO!!!\nO Código deve conter números!" + tela.returnMsg());
                            Console.ReadKey();
                        }

                    }
                }

                catch (FileNotFoundException e)
                {
                    Console.WriteLine(e.Message + tela.returnMsg());
                    Console.ReadKey();
                }
            }
            //final (ctrl.Equals("3"))---------------------------------------------------------------------------


            /**
             * Opção LISTAR ALARME
             * Instruções a serem executadas quando a opção 4 for escolhida.
            */
            else if (ctrl.Equals("4"))
            {
                /**
                 * tenta listar alarme, se não encontrar aquivo retorna exception.
                 */
                try
                {
                    List<Alarme> lista = rn.RetornaLista();

                    if (lista.Count() == 0)
                    {
                        Console.WriteLine("Não há alarmes cadastrados!");
                        Console.ReadKey();
                    }
                    else
                    {
                        Console.Clear();

                        Console.WriteLine(tela.header());
                        Console.WriteLine(tela.list());

                        try
                        {
                            Console.WriteLine(tela.ListarAlarmes(rn.RetornaLista()));

                            Console.Write(tela.hr());
                            Console.WriteLine(tela.returnMsg());
                            Console.ReadKey();
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine(e.Message + tela.returnMsg());
                            Console.ReadKey();
                        }
                    }
                }
                catch (FileNotFoundException e)
                {
                    Console.WriteLine(e.Message + tela.returnMsg());
                    Console.ReadKey();
                }
            }
            //final (ctrl.Equals("4"))---------------------------------------------------------------------------


        }//final Seleciona()---------------------------------------------------------------------------

    }//final Class---------------------------------------------------------------------------

}//final namespace---------------------------------------------------------------------------
